stm32串口热拔插以后,接收数据出错的处理办法

您所在的位置:网站首页 cms79f723 uart异常 stm32串口热拔插以后,接收数据出错的处理办法

stm32串口热拔插以后,接收数据出错的处理办法

2024-07-15 06:35| 来源: 网络整理| 查看: 265

最近发现,STM32中断接收完成回调函数在USB转CH340模块带电拔插一次以后会出现异常数据。具体的来说是数据出现一次右移,再出现一次右移,以后每次接受接收到的数据都出现位移。引起这个问题的原因可能是拔掉以后导致STM32串口硬件出错。硬件出错必须要复位才行,那怎么在单片机正常运行的时候怎么判断串口硬件出错呢?

我在网上找了很多的资料,大多数的都出现在处理数据上。不是和我问题很接近的。然后我想在HAL库的串口.c文件中找问题所在。

首先,HAL库的串口库stm32f1xx_hal_uart.c中有明确的表示,注意下方红色字体。

在官方库的介绍中,有详细的讲解,如何使用这些函数,以及出现问题怎么解决,我们只要花点时间去琢磨他还是可以找到问题的关键的。

在stm32f1xx_hal_uart.c文件中的这段话大体意思是;

(+)错误被认为是可恢复的和非阻塞的:传输可以一直进行到结束,但是错误的严重性将由用户评估:这涉及到帧错误、奇偶校验错误或中断模式接收中的噪声错误。然后检索接收到的字符并将其存储在Rx缓冲区中,设置错误代码以允许用户识别错误类型,并执行HAL_UART_ErrorCallback()用户回调。传输在UART上继续进行侧面。如果用户想要中止它,中止服务应该由用户调用。

(+)错误被视为阻塞:传输无法正确完成,是中止了。这个涉及中断模式接收中的超限错误和DMA中的所有错误模式。错误代码被设置为允许用户识别错误类型,并执行HAL_UART_ErrorCallback()用户回调。

出现错误会在HAL_UART_ErrorCallback()函数中处理,这样的话我们在错误回调函数中复位,当检测到硬件错误,就在这里复位。下面添加复位代码:

 

先关闭中断,再软件复位。可以解决问题。

复位是最简单的方案,当然有的朋友说,我还有其他的任务要处理,不能在此处复位。这样的话我们在错误中断回调函数里重新初始化串口好像也行。但是我没有试验。有感兴趣的朋友可以试一试。

转载请注明出处。

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3